#ifndef BUFFER_HPP
#define BUFFER_HPP

#include <list>
#include <stdexcept>


template<class T>
class Buffer {
private:
	const unsigned int _tamMax;
	std::list<T> _lElementos;

public:
	Buffer(int tamMaximo) : _tamMax(tamMaximo){ }
	~Buffer(){ }

	int getCantMax() const { return this->_tamMax; }
	int getCantElem() const { return this->_lElementos.size(); }

	bool agregarElem(T elem);
	bool quitarElemento(T& elem);

	// Devuelve una copia del elemento en la posicion señalada
	T verElemento(unsigned int pos) const;
};



template<class T>
bool Buffer<T>::agregarElem(T elem){
	// Esta lleno el buffer
	if (this->_lElementos.size() == this->_tamMax){
		return false;
	}

	this->_lElementos.push_back(elem);
	return true;
}


template<class T>
bool Buffer<T>::quitarElemento(T& elem){
	// Esta vacio el buffer
	if (this->_lElementos.size() == 0){
		return false;
	}

	elem = this->_lElementos.front();
	this->_lElementos.pop_front();

	return true;
}


template<class T>
T Buffer<T>::verElemento(unsigned int pos) const {
	if (pos > this->_tamMax)
		throw std::range_error("No existe elemento en la posicion pedida");

	typename std::list<T>::const_iterator cit = this->_lElementos.begin();
	std::advance(cit, pos);

	return *cit;
}


#endif /* BUFFER_H_ */
